package se.thoka.twt.client.utils;

/**
 * @author Thobias Karlsson, Thoka
 * @since 8 jan 2010
 */
public class Navigator {
	/**
	 * @return The currently used browser name
	 */
	public static String getBrowser() {
		initJavaScript();

		return getJavaScriptBrowser();
	}

	/**
	 * @return The currently used browser version
	 */
	public static String getBrowserVersion() {
		initJavaScript();

		return getJavaScriptBrowserVersion();
	}

	/**
	 * @return The currently used operating system
	 */
	public static String getOS() {
		initJavaScript();

		return getJavaScriptOS();
	}

	/**
	 * @return Formatted information about the browser and the operating system
	 */
	public static String getFormattedInformation() {
		return getBrowser() + " " + getBrowserVersion() + " on " + getOS();
	}

	private static native String getJavaScriptBrowser() /*-{
		return $wnd.BrowserDetect ? $wnd.BrowserDetect.browser : "An unknown browser";
	}-*/;

	private static native String getJavaScriptBrowserVersion() /*-{
		return $wnd.BrowserDetect ? "" + $wnd.BrowserDetect.version : "an unknown version";
	}-*/;

	private static native String getJavaScriptOS() /*-{
		return $wnd.BrowserDetect ? $wnd.BrowserDetect.OS : "an unknown OS";
	}-*/;

	private static native void initJavaScript() /*-{
		if (!$wnd.BrowserDetect) {
			$wnd.BrowserDetect = {
				init: function () {
					this.browser = this.searchString(this.dataBrowser) || "An unknown browser";
					this.version = this.searchVersion(navigator.userAgent)
						|| this.searchVersion(navigator.appVersion)
						|| "an unknown version";
					this.OS = this.searchString(this.dataOS) || "an unknown OS";
				},
				searchString: function (data) {
					for (var i=0;i<data.length;i++)	{
						var dataString = data[i].string;
						var dataProp = data[i].prop;
						this.versionSearchString = data[i].versionSearch || data[i].identity;
						if (dataString) {
							if (dataString.indexOf(data[i].subString) != -1)
								return data[i].identity;
						}
						else if (dataProp)
							return data[i].identity;
					}
				},
				searchVersion: function (dataString) {
					var index = dataString.indexOf(this.versionSearchString);
					if (index == -1) return;
					return parseFloat(dataString.substring(index+this.versionSearchString.length+1));
				},
				dataBrowser: [
					{
						string: navigator.userAgent,
						subString: "Chrome",
						identity: "Chrome"
					},
					{ 	string: navigator.userAgent,
						subString: "OmniWeb",
						versionSearch: "OmniWeb/",
						identity: "OmniWeb"
					},
					{
						string: navigator.vendor,
						subString: "Apple",
						identity: "Safari",
						versionSearch: "Version"
					},
					{
						prop: window.opera,
						identity: "Opera"
					},
					{
						string: navigator.vendor,
						subString: "iCab",
						identity: "iCab"
					},
					{
						string: navigator.vendor,
						subString: "KDE",
						identity: "Konqueror"
					},
					{
						string: navigator.userAgent,
						subString: "Firefox",
						identity: "Firefox"
					},
					{
						string: navigator.vendor,
						subString: "Camino",
						identity: "Camino"
					},
					{		// for newer Netscapes (6+)
						string: navigator.userAgent,
						subString: "Netscape",
						identity: "Netscape"
					},
					{
						string: navigator.userAgent,
						subString: "MSIE",
						identity: "Explorer",
						versionSearch: "MSIE"
					},
					{
						string: navigator.userAgent,
						subString: "Gecko",
						identity: "Mozilla",
						versionSearch: "rv"
					},
					{ 		// for older Netscapes (4-)
						string: navigator.userAgent,
						subString: "Mozilla",
						identity: "Netscape",
						versionSearch: "Mozilla"
					}
				],
				dataOS : [
					{
						string: navigator.platform,
						subString: "Win",
						identity: "Windows"
					},
					{
						string: navigator.platform,
						subString: "Mac",
						identity: "Mac"
					},
					{
						   string: navigator.userAgent,
						   subString: "iPhone",
						   identity: "iPhone/iPod"
				    },
					{
						string: navigator.platform,
						subString: "Linux",
						identity: "Linux"
					}
				]
			
			};
			$wnd.BrowserDetect.init();
		}
	}-*/;
}
